<?xml version="1.0" encoding="utf-8"?>
<!-- GPX.xsd version 1.0 - For more information on GPX and this schema, visit http://www.topografix.com/gpx.asp -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gpx="http://www.topografix.com/GPX/1/0" targetNamespace="http://www.topografix.com/GPX/1/0" elementFormDefault="qualified">
  <!-- Main GPX definition -->
  <xsd:element name="gpx">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="name" type="xsd:string" minOccurs="0" />
        <!-- GPX file name -->
        <xsd:element name="desc" type="xsd:string" minOccurs="0" />
        <!-- GPX file description -->
        <xsd:element name="author" type="xsd:string" minOccurs="0" />
        <!-- GPX file author -->
        <xsd:element name="email" type="gpx:emailType" minOccurs="0" />
        <!-- GPX file author email -->
        <xsd:element name="url" type="xsd:anyURI" minOccurs="0" />
        <!-- GPX file URL -->
        <xsd:element name="urlname" type="xsd:string" minOccurs="0" />
        <xsd:element name="time" type="xsd:dateTime" minOccurs="0" />
        <!-- GPX file creation time -->
        <xsd:element name="keywords" type="xsd:string" minOccurs="0" />
        <!-- GPX file keywords -->
        <xsd:element name="bounds" type="gpx:boundsType" minOccurs="0" />
        <!-- GPX file bounding rect -->
        <xsd:element name="wpt" minOccurs="0" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <!-- Position info -->
              <xsd:element name="ele" type="xsd:decimal" minOccurs="0" />
              <xsd:element name="time" type="xsd:dateTime" minOccurs="0" />
              <xsd:element name="magvar" type="gpx:degreesType" minOccurs="0" />
              <xsd:element name="geoidheight" type="xsd:decimal" minOccurs="0" />
              <!-- Description info -->
              <xsd:element name="name" type="xsd:string" minOccurs="0" />
              <xsd:element name="cmt" type="xsd:string" minOccurs="0" />
              <xsd:element name="desc" type="xsd:string" minOccurs="0" />
              <xsd:element name="src" type="xsd:string" minOccurs="0" />
              <xsd:element name="url" type="xsd:anyURI" minOccurs="0" />
              <xsd:element name="urlname" type="xsd:string" minOccurs="0" />
              <xsd:element name="sym" type="xsd:string" minOccurs="0" />
              <xsd:element name="type" type="xsd:string" minOccurs="0" />
              <!-- Accuracy info -->
              <xsd:element name="fix" type="gpx:fixType" minOccurs="0" />
              <xsd:element name="sat" type="xsd:nonNegativeInteger" minOccurs="0" />
              <xsd:element name="hdop" type="xsd:decimal" minOccurs="0" />
              <xsd:element name="vdop" type="xsd:decimal" minOccurs="0" />
              <xsd:element name="pdop" type="xsd:decimal" minOccurs="0" />
              <xsd:element name="ageofdgpsdata" type="xsd:decimal" minOccurs="0" />
              <xsd:element name="dgpsid" type="gpx:dgpsStationType" minOccurs="0" />
              <!-- you can add your own privately defined wpt elements at the end of the wpt -->
              <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded" />
            </xsd:sequence>
            <xsd:attribute name="lat" type="gpx:latitudeType" use="required" />
            <xsd:attribute name="lon" type="gpx:longitudeType" use="required" />
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="rte" minOccurs="0" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="name" type="xsd:string" minOccurs="0" />
              <xsd:element name="cmt" type="xsd:string" minOccurs="0" />
              <xsd:element name="desc" type="xsd:string" minOccurs="0" />
              <xsd:element name="src" type="xsd:string" minOccurs="0" />
              <!-- the source of this data: "Garmin eTrex", "Map", etc -->
              <xsd:element name="url" type="xsd:anyURI" minOccurs="0" />
              <xsd:element name="urlname" type="xsd:string" minOccurs="0" />
              <xsd:element name="number" type="xsd:nonNegativeInteger" minOccurs="0" />
              <!-- GPS track number -->
              <!--	  <xsd:element name="type"			type="xsd:string"	minOccurs="0"/>	PROPOSED -->
              <!-- you can add your own privately defined rte elements at the end of the rte -->
              <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded" />
              <xsd:element name="rtept" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                  <xsd:sequence>
                    <!-- elements must appear in this order -->
                    <!-- Position info -->
                    <xsd:element name="ele" type="xsd:decimal" minOccurs="0" />
                    <xsd:element name="time" type="xsd:dateTime" minOccurs="0" />
                    <xsd:element name="magvar" type="gpx:degreesType" minOccurs="0" />
                    <xsd:element name="geoidheight" type="xsd:decimal" minOccurs="0" />
                    <!-- Description info -->
                    <xsd:element name="name" type="xsd:string" minOccurs="0" />
                    <xsd:element name="cmt" type="xsd:string" minOccurs="0" />
                    <xsd:element name="desc" type="xsd:string" minOccurs="0" />
                    <xsd:element name="src" type="xsd:string" minOccurs="0" />
                    <xsd:element name="url" type="xsd:anyURI" minOccurs="0" />
                    <xsd:element name="urlname" type="xsd:string" minOccurs="0" />
                    <xsd:element name="sym" type="xsd:string" minOccurs="0" />
                    <xsd:element name="type" type="xsd:string" minOccurs="0" />
                    <!-- Accuracy info -->
                    <xsd:element name="fix" type="gpx:fixType" minOccurs="0" />
                    <xsd:element name="sat" type="xsd:nonNegativeInteger" minOccurs="0" />
                    <xsd:element name="hdop" type="xsd:decimal" minOccurs="0" />
                    <xsd:element name="vdop" type="xsd:decimal" minOccurs="0" />
                    <xsd:element name="pdop" type="xsd:decimal" minOccurs="0" />
                    <xsd:element name="ageofdgpsdata" type="xsd:decimal" minOccurs="0" />
                    <xsd:element name="dgpsid" type="gpx:dgpsStationType" minOccurs="0" />
                    <!-- you can add your own privately defined rtept elements at the end of the rtept -->
                    <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded" />
                  </xsd:sequence>
                  <xsd:attribute name="lat" type="gpx:latitudeType" use="required" />
                  <xsd:attribute name="lon" type="gpx:longitudeType" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="trk" minOccurs="0" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="name" type="xsd:string" minOccurs="0" />
              <xsd:element name="cmt" type="xsd:string" minOccurs="0" />
              <xsd:element name="desc" type="xsd:string" minOccurs="0" />
              <xsd:element name="src" type="xsd:string" minOccurs="0" />
              <!-- the source of this data: "Garmin eTrex", "Map", etc -->
              <xsd:element name="url" type="xsd:anyURI" minOccurs="0" />
              <xsd:element name="urlname" type="xsd:string" minOccurs="0" />
              <xsd:element name="number" type="xsd:nonNegativeInteger" minOccurs="0" />
              <!-- GPS track number -->
              <!-- 	  <xsd:element name="type"			type="xsd:string"		minOccurs="0"/>  PROPOSED -->
              <!-- you can add your own privately defined trk elements at the end of the trk -->
              <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded" />
              <xsd:element name="trkseg" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                  <xsd:sequence>
                    <!-- elements must appear in this order -->
                    <xsd:element name="trkpt" minOccurs="0" maxOccurs="unbounded">
                      <xsd:complexType>
                        <xsd:sequence>
                          <!-- elements must appear in this order -->
                          <!-- Position info -->
                          <xsd:element name="ele" type="xsd:decimal" minOccurs="0" />
                          <xsd:element name="time" type="xsd:dateTime" minOccurs="0" />
                          <xsd:element name="course" type="gpx:degreesType" minOccurs="0" />
                          <xsd:element name="speed" type="xsd:decimal" minOccurs="0" />
                          <xsd:element name="magvar" type="gpx:degreesType" minOccurs="0" />
                          <xsd:element name="geoidheight" type="xsd:decimal" minOccurs="0" />
                          <!-- Description info -->
                          <xsd:element name="name" type="xsd:string" minOccurs="0" />
                          <xsd:element name="cmt" type="xsd:string" minOccurs="0" />
                          <xsd:element name="desc" type="xsd:string" minOccurs="0" />
                          <xsd:element name="src" type="xsd:string" minOccurs="0" />
                          <xsd:element name="url" type="xsd:anyURI" minOccurs="0" />
                          <xsd:element name="urlname" type="xsd:string" minOccurs="0" />
                          <xsd:element name="sym" type="xsd:string" minOccurs="0" />
                          <xsd:element name="type" type="xsd:string" minOccurs="0" />
                          <!-- Accuracy info -->
                          <xsd:element name="fix" type="gpx:fixType" minOccurs="0" />
                          <xsd:element name="sat" type="xsd:nonNegativeInteger" minOccurs="0" />
                          <xsd:element name="hdop" type="xsd:decimal" minOccurs="0" />
                          <xsd:element name="vdop" type="xsd:decimal" minOccurs="0" />
                          <xsd:element name="pdop" type="xsd:decimal" minOccurs="0" />
                          <xsd:element name="ageofdgpsdata" type="xsd:decimal" minOccurs="0" />
                          <xsd:element name="dgpsid" type="gpx:dgpsStationType" minOccurs="0" />
                          <!-- you can add your own privately defined trkpt elements at the end of the trkpt -->
                          <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded" />
                        </xsd:sequence>
                        <xsd:attribute name="lat" type="gpx:latitudeType" use="required" />
                        <xsd:attribute name="lon" type="gpx:longitudeType" use="required" />
                      </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="x" type="xsd:string" />
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
        <!-- you can add your own privately defined elements at the end of the GPX file -->
        <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded" />
      </xsd:sequence>
      <xsd:attribute name="version" type="xsd:string" use="required" fixed="1.0" />
      <!-- version 1.0 -->
      <xsd:attribute name="creator" type="xsd:string" use="required" />
    </xsd:complexType>
  </xsd:element>
  <!-- Other types used by GPX -->
  <xsd:simpleType name="latitudeType">
    <xsd:restriction base="xsd:decimal">
      <xsd:minInclusive value="-90.0" />
      <xsd:maxInclusive value="90.0" />
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="longitudeType">
    <xsd:restriction base="xsd:decimal">
      <xsd:minInclusive value="-180.0" />
      <xsd:maxInclusive value="180.0" />
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="degreesType">
    <!-- for bearing, heading, course.  Units are degrees, true -->
    <xsd:restriction base="xsd:decimal">
      <xsd:minInclusive value="0.0" />
      <xsd:maxInclusive value="360.0" />
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="fixType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="none" />
      <!-- none means GPS had no fix.  To signify "the fix info is unknown, leave out the <fix> tag entirely -->
      <xsd:enumeration value="2d" />
      <xsd:enumeration value="3d" />
      <xsd:enumeration value="dgps" />
      <xsd:enumeration value="pps" />
      <!-- military signal used -->
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="dgpsStationType">
    <xsd:restriction base="xsd:integer">
      <xsd:minInclusive value="0" />
      <xsd:maxInclusive value="1023" />
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:complexType name="boundsType">
    <!-- bounding rect for data in file -->
    <xsd:attribute name="minlat" type="gpx:latitudeType" use="required" />
    <xsd:attribute name="minlon" type="gpx:longitudeType" use="required" />
    <xsd:attribute name="maxlat" type="gpx:latitudeType" use="required" />
    <xsd:attribute name="maxlon" type="gpx:longitudeType" use="required" />
  </xsd:complexType>
  <xsd:simpleType name="emailType">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="[\p{L}_]+(\.[\p{L}_]+)*@[\p{L}_]+(\.[\p{L}_]+)+" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>